package BinaryTreePackage;

/**
 * @author Lzm
 * @version 1.0
 */
public class isSymmetric_ {


  // 1. 确定参数和返回值
  // 2. 确定终止条件
  // 3. 处理每层逻辑


  // 本体确定遍历顺序为后序左右中
  // 遍历顺序需要从整体上看
  // 需要先处理左子树 再处理右子树最后将处理结果返回给根节点
  /*public boolean isSymmetric(TreeNode root) {
    // 确定终止条件
    if(root == null || (root.left == null && root.right == null)){
      return true;
    }
    if ((root.left == null && root.right != null) || (root.left != null && root.right == null)){
      return false;
    }
    if (root.right != null && root.left != null && root.left.val != root.right.val){
      return false;
    }
    if(root.left.val == root.right.val){
      return true;
    }
    isSymmetric(root.left);
    isSymmetric(root.right);
    return true;
    }*/


  public boolean compare(TreeNode left,TreeNode right) {
    // 确定终止条件
    if (left != null && right != null && left.val != right.val){
      return false;
    }
    if (left != null && right == null || left == null && right != null){
      return false;
    }
    if (left == null && right == null){
      return true;
    }
    // 当左右子树都不为空且值相等就应该向下去遍历
    // 比较左子树的左节点和右子树的右节点是否相同
    boolean leftCompare = compare(left.left, right.right);
    // 比较左子树的右节点和右子树的左节点
    boolean rightCompare = compare(left.right, right.left);
    // 当leftCompare和rightCompare均为true时才能说明是对称
    return leftCompare && rightCompare;
  }
}

